package cn.sunshine.ymcc.service.impl;

import cn.sunshine.ymcc.domain.Course;
import cn.sunshine.ymcc.domain.KillActivity;
import cn.sunshine.ymcc.domain.KillCourse;
import cn.sunshine.ymcc.dto.KillParamDto;
import cn.sunshine.ymcc.mapper.KillCourseMapper;
import cn.sunshine.ymcc.service.IKillActivityService;
import cn.sunshine.ymcc.service.IKillCourseService;
import cn.sunshine.ymcc.util.AssertUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Mr.Jiang
 * @since 2022-08-23
 */
@Service
public class KillCourseServiceImpl extends ServiceImpl<KillCourseMapper, KillCourse> implements IKillCourseService {
@Autowired
private IKillActivityService killActivityService;
@Autowired
private IKillCourseService killCourseService;
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
    /**
* @Title: add
* @Description: 将课程加入到秒杀当中
* @Author: Mr.Jiang
* @Version: 1.0
* @Date:  2022/8/23 19:14
* @Parameters: [killCourse]
* @Return void
*/
    @Override
    public void add(KillCourse killCourse) {
        // 1.校验课程状态，只有上架了的课程才有资格加入到秒杀活动中。
        boolean isOk = killCourse.getPublishStatus() == Course.STATE_ON_LINE;
        AssertUtil.isTrue(isOk,"该课程未上架不能加入秒杀");
        // 2.在同一个活动中不能有两个相同的课程
        Wrapper<KillCourse> querry = new EntityWrapper<>();
        querry.eq("course_id",killCourse.getCourseId());
        querry.eq("activity_id",killCourse.getActivityId());
        KillCourse courseKill = selectOne(querry);
        // 此时按道理上来说是查出来的为空才对。
        AssertUtil.isNull(courseKill,"该秒杀活动已有该课程了");
        // 3.这一步判断秒杀活动是不是待发布状态，若是就可以准备加入了
        KillActivity killActivity = killActivityService.selectById(killCourse.getActivityId());
       // 3.1 查看课程是否存在
        AssertUtil.isNotNull(killActivity,"活动不存在怎么玩儿？？？");
        // 3.2 查看状态
        boolean NotPublish = killActivity.getPublishStatus() == KillActivity.KILL_STATUS_PUBLISH;
        AssertUtil.isTrue(NotPublish,"请仔细查看活动日期");
        // 4.上面都没有问题了就可以存数据了（存在秒杀表中t_kill_course）
        // 此时的秒杀课程的发布时间和状态就要和你选择的活动一致
        killCourse.setPublishStatus(killActivity.getPublishStatus());
        killCourse.setStartTime(killActivity.getBeginTime());
        killCourse.setEndTime(killActivity.getEndTime());
        // 时间段
        killCourse.setTimeStr(killActivity.getTimeStr());
        killCourse.setKillLimit(1);
        // 加入秒杀的时间
        killCourse.setCreateTime(new Date());
        insert(killCourse);



    }
/**
* @Title: onlineAllKillCourse
* @Description:  List<KillCourse>查询所有发布到Redis上的秒杀课程
* @Author: Mr.Jiang
* @Version: 1.0
* @Date:  2022/8/24 18:51
* @Parameters: []
* @Return java.util.List<cn.sunshine.ymcc.domain.KillCourse>
*/
    @Override
    public List<KillCourse> onlineAllKillCourse() {
// 1.去Redis中拿到所有的活动Key （  在KillActivityServiceImpl第六步存的大Key activity:）

        Set<Object> keys = redisTemplate.keys("activity:*"); // 这是为了拿到大Key下的小Key们，为了拿values
        // 2.遍历keys
        List<KillCourse> killCourses = new ArrayList<>(); // 这样写好处在于若是以后不用ArrayList这个实现类可以直接在这里换就行，简单
        keys.forEach(key->{
            List values = redisTemplate.opsForHash().values(key);
            killCourses.addAll(values);
        });
        return killCourses;
    }
/*
* @Title: onlineone
* @Description: 从Redis中查询一个秒杀课程
* @Author: Mr.Jiang
* @Version: 1.0
* @Date:  2022/8/25 19:54
* @Parameters: []
* @Return cn.sunshine.ymcc.domain.KillCourse
*/
    @Override
    public KillCourse onlineone(Long killId, Long activityId) {
       /* "activity:"+activityId,
                killCourse.getCourseId().toString(),
                killCourse);
        */

        KillCourse killCourse = (KillCourse)redisTemplate.opsForHash().get(
                "activity:"+activityId,
                killId.toString()
        );
        return killCourse;
    }
/*
* @Title: kill
* @Description: 秒杀
* @Author: Mr.Jiang
* @Version: 1.0
* @Date:  2022/8/25 22:40
* @Parameters: [killParamDto]
* @Return java.lang.String
*/
    @Override
    public String kill(KillParamDto killParamDto) {

        return null;
    }
}
